	/*
	 * jQuery MB Table 1.0
	 *
	 * Copyright 2011, Marcin Baniowski
	 *
	 *	Depends:
	 *	jquery.ui.core.js
	 *	jquery.ui.widget.js
	 *	jquery.cookie.js
	 */
	// TODO - pobranie info o tabeli (np. ilość wszytkich rekordów - tylko w _create
	// TODO - pobierania do paginacji w _init [?]
	// TODO = $.cookie do zapamiętywania strony
	// TODO - !!! do zapamiętywania stron w cookies - do nazwy cookie dodać nazwę instancji mbtable
	// TODO - live search - z ładowaniem danych do osobnej tablicy js [?]; albo:
	// TODO - filtry - w każdej kolumnie jedno pole u góry tabeli
	// TODO - czytanie wszystkich pól tabeli z bazy - możliwość zmiany nazwy w nagłówku
	// TODO - sortowanie po nagłówkach
	// TODO - nazwa tabeli do options
	(function($) {
		$.widget("mb.mbtable", {
			options: {
				url: null,
				limit: 20,
				order: {
					column: null,
					direction: 'asc'
				},
				fields: null,
				table: null,
				maxLengthField:20
			},

		_create: function() {
			if($.cookie('page_number'))
				var page = $.cookie('page_number');
			else
				var page = 0;
			this.goToPage(page);
		},

		_init: function(){

		},

		goToPage: function(pageId){
			var el = this.element;
			el.empty();
			var self = this;
			var o = this.options;
			var rowsTotal = 0;
			var table = $('<table />').addClass('mbtable');
			var pagWrap = $('<div />').addClass("mb-table-pagination");
			el.html('<img src="images/ajax-loader-1.gif" />');
			// pola tabeli
//			var fields = o.fields;
			var fe = "[";
			for(var j in o.fields ){
				fe += '{"old":"'+j+'","my":"'+o.fields[j]+'"},';
			}
			var fields = fe.substring(0, fe.length-1);
			fields += "]";
			$.ajax({
				url: o.url,
				type: "post",
				data: "action=getdata&page="+pageId+"&limit="+o.limit+"&order_col="+o.order.column+"&order_dir="+o.order.direction+"&fields="+fields+"&table="+o.table,
				dataType: 'json',
				success: function(result){
//					console.log(result.columns);return false;
//					console.log(result.columns[0]['Field']);return false;
//					console.log(result.columns.length);return false;
					var columns = result.columns;
					var data = result.data;
//					console.log(pk);return false;
					rowsTotal = result.count;
					var tr = '';
					var td = '';
					var th = '';
					// table header
					tr = $('<tr />');
					var pk = null;
					for(i=0;i<columns.length;i++){
						// Primary Key
						if(columns[i]['Key'] == 'PRI'){
							pk = columns[i];
							self._PrimaryKey(pk);
						}
						// generowanie nagłówka
						// TODO - szerokość kolumny w zależności od typu pola
						// jeżeli nazwa zdefiniowana przez użytkownika
						if(typeof columns[i]['userName'] != 'undefined' && columns[i]['userName'] != ''){
							th = $('<th />').html(columns[i]['userName']);
						}else{
							th = $('<th />').html(columns[i]['Field']);
						}

						th.appendTo(tr);
					}
					$('<thead />').append(tr).appendTo(table);
					// table data
					var tbody = $('<tbody />');
//					var colName = null;
//					var cellClass = null;
					var parts;
					var value;
					var fieldValue;
					var finalValue;
					for(i=0;i<result.data.length;i++){
						tr = $('<tr />');
//						var k = 0;
						
						for (j=0;j<result.columns.length;j++){
							// ustalanie rodzaju pola w zależności od typu pola tabeli w bazie
							// TODO - cały poniższy 'switch' przenieść do góry do generowania nagłówka
							var type = columns[j]['Type'];
							if((/text/).test(type)){
//								cellClass = 'blue';
//								var parts =  type.split('(');
//								var value = parts[1].slice(0, -1)
							}
							if((/int/).test(type)){
//								cellClass = 'green';
								parts =  type.split('(');
								value = parts[1].slice(0, -1)
							}
							if((/varchar/).test(type)){
//								cellClass = 'orange';
								parts =  type.split('(');
								value = parts[1].slice(0, -1);
							}

							// truncate
							fieldValue = data[i][columns[j]['Field']];
							finalValue = self._truncate(fieldValue);

							// wyświetlanie komórek
							td = $('<td />')
//								.css('background-color',cellClass)
								.attr({
									'id':data[i][pk['Field']]+'_|_'+columns[j]['Field'],
									'long':fieldValue
								})
								.html(finalValue);

							if(j == 0)
								td.addClass('td-first');
							td.appendTo(tr);
//							k++;
							cellClass = null;
							parts = null;
							value = '';
						}
						tr.appendTo(tbody);
					}
					tbody.appendTo(table);
					// edit event
					table.find('td').bind('dblclick.mbtable',function(){
						var field_id = $(this).attr('id');
						self.editcell($(this));
					})
//					table.appendTo(el);
//					el.html(table);

					// pagination
					var pagesNumber = Math.ceil(rowsTotal / o.limit);
					var anchor = "";
					for(i=0;i<pagesNumber;i++){
						if(i == pageId)
							anchor = $("<div />").addClass('active').text(i+1);
						else
							anchor = $("<div />").text(i+1);
						anchor.bind('click.mbtable',function(){
							var val = $(this).text()*1-1;
							$.cookie('page_number',val)
							self.goToPage(val);
						})
						anchor.appendTo(pagWrap);
					}
					el.empty();
					el.html(table);
					pagWrap.insertAfter(table);
				}
			});
		},

		editcell: function(obj){
			self = this;
			var cont = obj.text();
			var contFull = obj.attr('long');
			var editOk = $('<button />').text('Ok');
			var editCancel = $('<button />').text('Anuluj');
			var input = $('<input />').attr('type','text').val(contFull);
			input.insertAfter(obj);
			editOk.insertAfter(input);
			editCancel.insertAfter(input);
			obj.hide();
			editCancel.bind('click.mbtable',function(){
				input.hide();
				editCancel.hide();
				editOk.hide();
				obj.show();
			});
			editOk.bind('click.mbtable',function(){
				self._updateData(input.val(),obj.attr('id'));
				input.hide();
				editCancel.hide();
				editOk.hide();
				obj.text(self._truncate(input.val()));
				obj.attr('long',input.val());
				obj.show();
			});
			this._trigger('editcell');
		},

		_PrimaryKey: function(pk){
			// setter
			if(pk)
				this.primKey = pk['Field'];
			else // setter
				return this.primKey;
		},

		_truncate: function(input){
			var max_length = this.options.maxLengthField;
			var output = '';
			if(input != null && input.length > max_length){
				output = input.replace(new RegExp('^(.{'+max_length+',}?)\\b.*'), '$1');
				output += '...';
			}else{
				output = input;
			}
			return output
		},

		_updateData: function(value,id){
//			alert(value+'-'+id);
			var pk = (this._PrimaryKey());
			var o = this.options;
			$.ajax({
				url: o.url,
				type: "post",
				data: "action=updatedata&value="+value+"&id="+id+"&table="+o.table+"&pk="+pk,
//				dataType: 'json',
				success: function(result){
					console.log(result);
				}
			});
		},

		destroy: function() {

		}

		});
	})(jQuery);